﻿using System;
using Iesi.Collections.Generic;

namespace CRC.Incidencias.Dominio.Clases
{
    public class Concepto
    {
        /*
         *  Contructor por defecto
        */
        public Concepto() { 
        }

        public Concepto(Concepto pPadre, String pStrDescripcion)
        {
            this.strDescripcion = pStrDescripcion;
            if (pPadre != null) { pPadre.añadirHijo(this); }
        }

    #region "Atributos y accesores" 

        private String strCodigo;
        private String strDescripcion = String.Empty;
        private Concepto padre = null;
        private ISet<Concepto> hijos = new HashedSet<Concepto>();

        public virtual String Codigo 
        {
            get { return this.strCodigo; }
            set { this.strCodigo = value; }
        }

        public virtual String Descripcion 
        {
            get { return this.strDescripcion; }
            set { this.strDescripcion = value; }
        }

        public virtual Concepto Padre
        {
            get { return this.padre; }
            set { this.padre = value; }
        }

        public virtual ISet<Concepto> Hijos 
        {
            get { return this.hijos; }
            set { this.hijos = value; }
        }

    #endregion

        public virtual Boolean EsRaiz() {
            return this.Padre == null;
        }

        public virtual String EscribirRuta()
        {
            return EscribeRuta_Rec(this);
        }

        private String EscribeRuta_Rec(Concepto pConceptoActual) 
        {
            if (pConceptoActual.EsRaiz()) { return pConceptoActual.Codigo + " - " + pConceptoActual.Descripcion; }
            else { return EscribeRuta_Rec(pConceptoActual.Padre) + "/" + pConceptoActual.Codigo + " - " + pConceptoActual.Descripcion; }
            
        }

        public virtual void añadirHijo(Concepto pHijo)
        {
            this.hijos.Add(pHijo);
            pHijo.padre = this;
        }

    }
}
